perm filename GAR50.FAI[MUS,LCS] blob
sn#102049 filedate 1974-05-13 generic text, type T, neo UTF8
00100 TITLE Gardsk; DOROTHY BENDER
00200
00300 ; ******* GAR50 ********
00400 ; ROUTINE TO READ THE OUTPUT FROM THE MUSIC
00500 ; PROGRAM AND CALL THE D-A CONVERTER TO PLAY.
00600 ;
00700 ; THE NAME OF THE FILE TO BE INPUTTED IS 'MUSIC',
00800 ; THE FIRST RECORD OF WHICH CONTAINS THE
00900 ; NUMBER OF WORDS OF DATA IN THE ENTIRE DISK FILE.
01000
01100 A ← 1 ;WORK
01200 B ← 2 ;WORK
01300 N←4
01400 FB←5
01500 TMP←7
01600 SEC←6
01700 RET ← 3 ;RETURN ACCUMULATOR
01800 BUFSIZ ←=20*2000 ;19 K PER BUFFER.
01900 BANDSZ←=1280 ;SECTORS PER BAND
02000 ↓DSKCHN ←1 ;DISK CHANNEL FOR INPUT
02100 ↓ADCHN ←2 ;D-A CHANNEL FOR OUTPUT
02200
02300 OPDEF FBWRT [707B8]
02400 OPDEF FBREAD [706B8]
02500 OPDEF READCH [51B8]
02600 OPDEF MESSAGE[51B8!3B12]
02700
02800 BEG: CALLI 0,0 ;RESET I/O DEVICES
02900 OPEN DSKCHN,[17 ;MODE
03000 'DSK ' ;DEVICE NAME
03100 0] ;NO BUFFER HEADERS
03200 HALT BEG ;RESTART IF DEVICE IS UNAVAILABLE
03300
03400 SETZM FILBLK+3 ;FOR RESTART
03500 LX: MESSAGE [ASCIZ/
03600 TYPE `P' TO PLAY FROM DISK, `C' TO COPY TAPE TO DISK.
03700 /]
03800 readch a
03900 cain a,"C"
04000 jrst start
04100 caie a,"P"
04200 jrst lx
04300 skipe filblk+3 ;is this first time through ?
04400 jrst pla3 ;No. Parameters already set up.
04500 ;FIND OUT NUMBER OF CHANNELS AND
04600 ;THE SPEED.
04700
04800 MESSAGE [ASCIZ/HOW MANY CHANNELS?/]
04900 READCH A
05000 SUBI A,"0"+1 ;CONVERT TO BINR AND ADD 1
05100 DPB A,[POINT 2,OUTBIT,26]
05200
05300 MESSAGE [ASCIZ/WHAT IS THE SPEED?/]
05400 READCH A
05500 SUBI A,"0"
05600 DPB A,[POINT 3,OUTBIT,32]
05700
05800 PLA2: SETZM FILBLK+3
05900 SETZM FILBL2+3
06000 LOOKUP DSKCHN,FILBLK
06100 SKIPA
06200 JRST XOPEN
06300 LOOKUP DSKCHN, FILBL2
06400
06500 JRST [MESSAGE[ASCIZ/
06600 ***FILE 'MUSIC' NOT FOUND/]
06700 CALLI 12]
06800 ;EXIT IF FILE IS MISSING
06900
07000 MOVE A, FILBL2+3
07100 MOVEM A, FILBLK+3
07200 XOPEN: movs n,filblk+3 ;get length of file.
07300 movnm n,nwd
07400 movei fb,0 ;Start with logical band no. 0.
07500 plx: movei sec,0
07600 MOVE TMP,FB
07700 calli TMP,400010 ;Get a fastband.
07800 halt
07900 ply: input dskchn,[iowd bufsiz,buf1
08000 0]
08100 movem sec,plzz
08200 fbwrt fb,[ buf1 ;Write out a buffer on the fastband.
08300 bufsiz
08400 plzz: 0]
08500 halt
08600 addi n,bufsiz
08700 jumpge n,pla3 ;At end of input file ?
08800 addi sec,BUFSIZ/=32 ;NO
08900 cail sec,BANDSZ ;End of band ?
09000 aoja fb,plx ;Yes.
09100 jrst ply
09200 pla3: close dskchn,0
09300 move n,nwd
09400 setzb fb,sec
09500 ;BEGIN MAIN BODY OF PROGRAM
09600 OPEN ADCHN,[117 ;MODE
09700 'AD ' ;DEVICE NAME
09800 0] ;NO BUFFER HEADERS
09900
10000 JRST [MESSAGE[ASCIZ/
10100 ***D-A NOT AVAILABLE/]
10200 CALLI 12]
10300 ;EXIT IF D-A IS UNAVAILABLE
10400 SPWAR: SPCWAR 17,[CALLI]
10500 MESSAGE [ASCIZ/ GO? /]
10600 READCH A
10700
10800 LOOP: JSP RET,subr ;RxoutINE TO READ AND WRITE
10900 BUF1-1 ;USE BUF1 FOR THE I/O
11000 JUMPLE B,xout ;DONE
11100
11200 JSP RET,subr ;CALL IT AGAIN
11300 BUF2-1 ;USE BUF2 FOR THE I/O
11400 JUMPG B,LOOP ;GO BACK FOR MORE IF B>0
11500
11600 xout: close dskchn, ;END OF PROGRAM.
11700 SPCWAR 0,'SSW'
11800 releas adchn,
11900 jrst lx
12000
12100 ;subrRxoutINE TO SET UP IOWD AND READ AND WRITE.
12200 ; 1(RET) WILL BE THE RETURN
12300 ; 0(RET) WILL BE THE ADDRESS OF THE BUFFER TO BE
12400 ; PUT IN THE RIGHT HALF OF THE IOWD.
12500 ; A WILL BE A WORK REGISTER
12600 ; B WILL BE TESTED ON THE xoutSIDE.
12700
12800 subr: MOVNI A,BUFSIZ ;PICK UP AND COMPLEMENT BUFSIZ
12900 ADDB A,N ;A←NWD-BUFSIZ
13000 ;NWD←NWD-BUFSIZ
13100 MOVE B,A ;SAVE B TO BE TESTED FOR LAST
13200 ;TIME.
13300 JUMPL A,LAST ;SET UP FOR LAST TIME.
13400 MOVEI A,0
13500
13600 ;THE IOWD LOOKS LIKE:
13700 ; [-BUFSIZ / BUFI-1]
13800
13900 LAST: ADDI A,BUFSIZ
14000 MOVNS A ;COMPLEMENT A
14100 HRL A,0(RET) ;PICK UP BUFI AND MOVE IT
14200 ;TO THE LEFT SIDE OF A.
14300 hlrzM A,INLIST ;SWAP A AND MOVE IT.
14400 MOVSM A,outWC ;SAME FOR xoutPUT.
14500 movem sec,inlist+2
14600 aos inlist ;Shit.
14700 fbread fb,inlist ;Read a buffer from fast dsk.
14800 halt
14900 OUTPUT ADCHN,OUTWC ;WRITE THE RECORD.
15000 addi sec,BUFSIZ/=32 ;NO
15100 caiGE sec,BANDSZ ;End of band ?
15200 JRST 1(RET) ;RETURN
15300 movei sec,0
15400 aoja fb,1(ret)
15500
15600 ; -----------------------------------------
15700
15800 ; STORAGE:
15900
16000 NWD: 0 ;FOR NUMBER OF WORDS OF INPUT.
16100 ↓BUF1: BLOCK BUFSIZ+1 ;BUFFER 1
16200 BUF2: BLOCK BUFSIZ+1 ;BUFFER 2
16300
16400 FILBLK: 'MUSIC ' ;FILENAME FOR INPUT
16500 'MUS ' ;EXTENSION
16600 0 ;INFORMATION ON FILE
16700 0 ;PROJECT PROG#
16800
16900 FILBL2: 'MUSAA '
17000 'DMD '
17100 0
17200 0
17300
17400 CLIST: IOWD 1,NWD ;FOR THE FIRST RECORD
17500 0
17600
17700 INLIST: 0 ;WILL CONTAIN AN IOWD
17800 bufsiz
17900 0
18000
18100 OUTWC: 0 ;WILL CONTAIN AN IOWD FOR D-A
18200 3650 ;MAGIC BITS FOR 136.
18300 OUTBIT: 4000 ;BITS FOR D-A
18400 BLOCK 2
18500 begin magdsk
18600
18700 A←1
18800 B←2
18900 D←3
19000 OLNG←=4096 ;size of mag tape records. must be multiple of =128.(USE 2342 FOR 360 TAPES)
19100
19200 ichn←adchn
19300 ochn←dskchn
19400 ↑START: CALLI 0
19500 INIT ICHN,3B28+17
19600 SIXBIT /MTA0/
19700 0
19800 HALT
19900 MTAPE ICHN,1 ;REWIND THE TAPE
20000 JFCL
20100 INIT OCHN,17
20200 SIXBIT /DSK/
20300 0
20400 HALT
20500 ENTER OCHN,[SIXBIT /MUSIC/
20600 SIXBIT /MUS/
20700 0
20800 0]
20900 HALT
21000 loop:input ichn,olst
21100 statz ichn,20000
21200 jrst xout ;end of tape.
21300 output ochn,olst
21400 jrst loop
21500 OLST: IOWD OLNG,OBUF
21600 0
21700 obuf←← buf1
21800 bend magdsk
21900
22000 end beg
22100